package com.kgcx.common.utils.money;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * 金额处理工具类
 * @author panjin.
 * @date 2017/12/13.
 */
public class MoneyTool {

    /**
     * 金额是否大于零
     * @param amount 金额
     * @return 大于零返回true
     */
    public static boolean greaterThanZero(BigDecimal amount) {
        return amount != null && amount.compareTo(BigDecimal.ZERO) > 0;
    }

    /**
     * 比较两个金额的大小
     * @param m1 如果为null，转化成零来比较
     * @param m2 如果为null，转化成零来比较
     * @return m1=m2返回0；m1>m2返回1；m1<m2返回-1
     */
    public static int compare(BigDecimal m1, BigDecimal m2) {
        return null2Zero(m1).compareTo(null2Zero(m2));
    }

    /**
     * 将null转化成零
     * @param amount 金额
     * @return 返回零
     */
    public static BigDecimal null2Zero(BigDecimal amount) {
        return amount == null ? BigDecimal.ZERO : amount;
    }

    /**
     * 多个金额相加，至少2个参数
     * @param amount1 金额1
     * @param amount2 金额2
     * @param amounts 金额对象或数组
     * @return 相加的金额
     */
    public static BigDecimal add(BigDecimal amount1, BigDecimal amount2, BigDecimal... amounts) {
        BigDecimal result = null2Zero(amount1).add(null2Zero(amount2));
        for (BigDecimal amount : amounts) {
            result = result.add(null2Zero(amount));
        }
        return result;
    }

    /**
     * 多个金额相乘，至少2个参数，不处理精度
     * @param amount1 金额1
     * @param amount2 金额2
     * @param amounts 金额对象或数组
     * @return 相乘的金额
     */
    public static BigDecimal multiply(BigDecimal amount1, BigDecimal amount2, BigDecimal... amounts) {
        BigDecimal result = null2Zero(amount1).multiply(null2Zero(amount2));
        for (BigDecimal amount : amounts) {
            result = result.multiply(null2Zero(amount));
        }
        return result;
    }

    /**
     * 多个金额相乘，至少2个参数，四舍五入保留两位小数
     * @param amount1 金额1
     * @param amount2 金额2
     * @param amounts 金额对象或数组
     * @return 相乘的金额
     */
    public static BigDecimal multiplyWithScale(BigDecimal amount1, BigDecimal amount2, BigDecimal... amounts) {
        BigDecimal result = null2Zero(amount1).multiply(null2Zero(amount2));
        for (BigDecimal amount : amounts) {
            result = result.multiply(null2Zero(amount));
        }
        result = result.setScale(2, RoundingMode.HALF_UP);
        return result;
    }

    /**
     * 减法
     * @param amount1 金额1
     * @param amount2 金额2
     * @return 小于0返回负数
     */
    public static BigDecimal subtract(BigDecimal amount1, BigDecimal amount2) {
        return null2Zero(amount1).subtract(null2Zero(amount2));
    }

    /**
     * 对两个字符串做除法（不丢失精度），四舍五入保留指定位数的小数
     * @param src   被除数
     * @param dest  除数
     * @param scale 精度
     * @return
     */
    public static BigDecimal divide(BigDecimal src, BigDecimal dest, int scale) {
        BigDecimal srcDeci = null2Zero(src);
        BigDecimal destDeci = null2Zero(dest);
        return srcDeci.divide(destDeci, scale, RoundingMode.HALF_UP);
    }

    /**
     * 元转分,去掉小数点
     * @param amount 金额
     * @return
     */
    public static BigDecimal yuan2Fen(BigDecimal amount) {
        if (amount == null) {
            return BigDecimal.ZERO;
        }
        return amount.movePointRight(2).setScale(0, BigDecimal.ROUND_DOWN);
    }

    /**
     * 金额精度检查
     * @param val
     * @param size
     * @return
     */
    public static boolean checkAmount(BigDecimal val, int size) {
        if (val == null || val.toString().split("\\.").length <= 1) {
            return false;
        }
        if (val.toString().split("\\.")[1].length() <= size) {
            return true;
        }
        return false;
    }

    /**
     * 检查是否是正确的资金金额
     * @param val
     * @return
     */
    public static boolean isValidAmount(BigDecimal val) {
        if (null == val) {
            return true;
        }
        BigDecimal result = new BigDecimal(val.toString()).setScale(2, RoundingMode.DOWN);
        if (result.compareTo(val) == 0) {
            return true;
        } else {
            return false;
        }
    }
}
